package tds.model15.version3;

import java.lang.reflect.Method;

/**
 * @Company 杭州先锋电子技术股份有限公司
 * @ClassName Event
 * @Description TODO（这里用一句话描述这个类的作用)
 * @author tds
 * @Date 2020/1/31 19:51
 * @version 1.0.0
 */
public class Event {
    /**
     * 要执行的方法对象
     */
    private Object object;

    /**
     * 要执行的方法名称
     */
    private String methodName;

    /**
     * 要执行的方法的参数
     */
    private Object[] params;

    /**
     * 要执行方法的参数类型
     */
    private Class[] paramTypes;

    public Event(){

    }

    public Event(Object object, String methodName, Object... args){
        this.object = object;
        this.methodName = methodName;
        this.params = args;
        contractParamTypes(this.params);
    }

    /**
     * @Description 根据参数数组生成参数类型数组
     * @param params
     * @return void
     */
    private void contractParamTypes(Object... params){
        this.paramTypes = new Class[params.length];
        for(int i = 0; i < params.length; i++){
            this.paramTypes[i] = params[i].getClass();
        }
    }

    public Object getObject() {
        return object;
    }

    /**
     * @Description 根据该对象的方法名，方法参数利用反射机制，执行该方法
     * @param
     * @return void
     */
    public void invoke() throws Exception {
        Method method = object.getClass().getMethod(methodName, paramTypes);
        if(method == null){
            return;
        }
        method.invoke(object, params);
    }
}
